home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / uniput.zip / UNIPUT.C < prev    next >
C/C++ Source or Header  |  1992-10-26  |  16KB  |  538 lines

  1. /**************************************************************************\
  2. * uniput.c -- input of unicode characters.
  3. *
  4. *         Steve Firebaugh
  5. *         Microsoft Developer Support
  6. *         Copyright (c) 1992 Microsoft Corporation
  7. *
  8. \**************************************************************************/
  9. #define UNICODE
  10.  
  11. #include <windows.h>
  12. #include <commdlg.h>
  13. #include "uniput.h"
  14.  
  15.  
  16. /* Misc. defines for size, color, and appearance of drawing. */
  17. #define GRIDCOLOR  PALETTEINDEX (6)
  18. #define TICKSPACE  20
  19. #define FWW_STEPS  40
  20.  
  21.  
  22. HANDLE hFile = INVALID_HANDLE_VALUE;
  23.  
  24. HANDLE OpenNewFile(HWND);
  25.  
  26.  
  27. TCHAR szHelpPathName[] = TEXT("uniput.HLP");
  28.  
  29. HANDLE hInst;
  30. HWND   hwndMain;
  31. HWND   hwndClient;
  32. HWND   hwndStatus;
  33.  
  34. int gShowhex, gShowNames;
  35.  
  36. #define STATUSHEIGHT 2*GetSystemMetrics(SM_CYMENU)
  37.  
  38.  
  39. /**************************************************************************\
  40. *
  41. *  function:  WinMain()
  42. *
  43. *  input parameters:  c.f. generic sample
  44. *
  45. \**************************************************************************/
  46. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  47.                      LPSTR lpCmdLine, int nCmdShow)
  48. {
  49.     MSG    msg;
  50.     CLIENTCREATESTRUCT clientcreate;
  51.     WNDCLASS  wc;
  52.  
  53.  
  54.     UNREFERENCED_PARAMETER( lpCmdLine );
  55.     UNREFERENCED_PARAMETER(  nCmdShow );
  56.     hInst = hInstance;
  57.  
  58.  
  59.     /* Check for previous instance.  If none, then register class. */
  60.     if (!hPrevInstance) {
  61.  
  62.       wc.style = NULL;
  63.       wc.lpfnWndProc = (WNDPROC)MainWndProc;
  64.  
  65.       wc.cbClsExtra = 0;
  66.       wc.cbWndExtra = 0;
  67.       wc.hInstance = hInstance;
  68.       wc.hIcon = LoadIcon(hInstance, TEXT("uniputIcon"));
  69.       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  70.       wc.hbrBackground = NULL;
  71.       wc.lpszMenuName =  TEXT("uniputMenu");
  72.       wc.lpszClassName = TEXT("uniput");
  73.  
  74.       if (!RegisterClass(&wc)) return (FALSE);
  75.  
  76.     }  /* class registered o.k. */
  77.  
  78.  
  79.     /* Create the main window.  Return false if CreateWindow() fails */
  80.     hwndMain = CreateWindow(
  81.         TEXT("uniput"),
  82.         TEXT("Input unicode characters"),
  83.         WS_OVERLAPPEDWINDOW,
  84.         CW_USEDEFAULT,
  85.         CW_USEDEFAULT,
  86.         CW_USEDEFAULT,
  87.         CW_USEDEFAULT,
  88.         NULL, NULL, hInst, NULL);
  89.  
  90.     if (!hwndMain) return (FALSE);
  91.  
  92.  
  93.     /* create the MDI "client" window. */
  94.     clientcreate.hWindowMenu  = GetSubMenu(GetMenu(hwndMain),2);
  95.     clientcreate.idFirstChild = 1;
  96.     hwndClient = CreateWindow(
  97.         TEXT("MDICLIENT"),
  98.         NULL,
  99.         WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | MDIS_ALLCHILDSTYLES,
  100.         0,0,0,0,
  101.         hwndMain, NULL, hInst, (LPVOID)&clientcreate);
  102.     if (!hwndClient) return (FALSE);
  103.  
  104.  
  105.  
  106.     /* create status bar */
  107.     wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
  108.     wc.lpfnWndProc = (WNDPROC)StatusWndProc;
  109.     wc.cbClsExtra = 0;
  110.     wc.cbWndExtra = 0;
  111.     wc.hInstance = hInst;
  112.     wc.hIcon = NULL;
  113.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  114.     wc.hbrBackground = GetStockObject (LTGRAY_BRUSH);
  115.     wc.lpszMenuName = NULL;
  116.     wc.lpszClassName = TEXT("status");
  117.     if (!RegisterClass(&wc)) return (FALSE);
  118.  
  119.     hwndStatus = CreateWindow(
  120.         TEXT("status"),
  121.         TEXT("status"),
  122.         WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | WS_BORDER,
  123.         0,0,
  124.         GetSystemMetrics(SM_CXFULLSCREEN),
  125.         STATUSHEIGHT,
  126.         hwndMain, NULL, hInst, 0);
  127.     if (!hwndStatus) return (FALSE);
  128.  
  129.  
  130.     ShowWindow(hwndMain, SW_SHOWDEFAULT);
  131.     SetCursor (LoadCursor (NULL, IDC_WAIT));
  132.  
  133.  
  134.     /* Create the first child window showing glyphs. */
  135.     wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
  136.     wc.lpfnWndProc = (WNDPROC)DisplayWndProc;
  137.     wc.cbClsExtra = 0;
  138.     wc.cbWndExtra = 12;
  139.     wc.hInstance = hInst;
  140.     wc.hIcon = LoadIcon(hInst, TEXT("uniputIcon"));
  141.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  142.     wc.hbrBackground = GetStockObject (WHITE_BRUSH);
  143.     wc.lpszMenuName = NULL;
  144.     wc.lpszClassName = TEXT("display");
  145.  
  146.  
  147.  
  148.     if (!RegisterClass(&wc)) return (FALSE);
  149.  
  150.  
  151.     /* set the menus to be correct */
  152.     SendMessage (hwndMain, WM_COMMAND, IDM_SHOWHEX,0);
  153.     SendMessage (hwndMain, WM_COMMAND, IDM_SHOWNAMES,0);
  154.  
  155.     /* Create one MDI child window to get started */
  156.     SendMessage (hwndMain, WM_COMMAND, IDM_NEWWINDOW, 0);
  157.  
  158.     SetCursor (LoadCursor (NULL, IDC_ARROW));
  159.  
  160.  
  161.  
  162.     /* Loop getting messages and dispatching them. */
  163.     while (GetMessage(&msg,NULL, NULL, NULL)) {
  164.         TranslateMessage(&msg);
  165.         DispatchMessage(&msg);
  166.     }
  167.  
  168.     return (msg.wParam);
  169. }
  170.  
  171.  
  172.  
  173. /**************************************************************************\
  174. *
  175. *  function:  MainWndProc()
  176. *
  177. *  input parameters:  normal window procedure parameters.
  178. *
  179. \**************************************************************************/
  180. LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  181. {
  182. HWND hwndActive;
  183.  
  184.   switch (message) {
  185.  
  186.     /**********************************************************************\
  187.     *  WM_CREATE
  188.     \**********************************************************************/
  189.     case WM_CREATE: {
  190.  
  191.     }
  192.  
  193.  
  194.     /**********************************************************************\
  195.     *  WM_SIZE
  196.     *
  197.     * When the frame is sized, then change the size of the MDI client,
  198.     *  excluding the status bar, and change the size and position of the
  199.     *  status bar.
  200.     \**********************************************************************/
  201.     case WM_SIZE: {
  202.  
  203.       RECT r;
  204.       GetClientRect (hwnd, &r);
  205.       r.bottom -= STATUSHEIGHT;
  206.  
  207.       SetWindowPos (hwndClient, HWND_BOTTOM,
  208.                     r.left, r.top, r.right, r.bottom, 0);
  209.  
  210.       /* size & position status bar: left, right, & top just out of view */
  211.       SetWindowPos (hwndStatus, HWND_TOP,
  212.         r.left-1, r.bottom,
  213.         r.right+2, STATUSHEIGHT+1, 0);
  214.  
  215.  
  216.       return TRUE;
  217.  
  218.     } break;
  219.  
  220.  
  221.  
  222.     /**********************************************************************\
  223.     *  WMU_CHARACTER
  224.     *
  225.     * global variable: hFile
  226.     *
  227.     * user message sent to main window when user hits a glyph square.
  228.     *  if the main window has a file open, then write this unicode
  229.     *  character to that file.
  230.     \**********************************************************************/
  231.     case WMU_CHARACTER: {
  232.         DWORD nBytes;
  233.         WCHAR tChar;
  234.  
  235.       tChar = (WCHAR)lParam;
  236.  
  237.       /* show it on the status bar */
  238.       SendMessage (hwndStatus, WMU_CHARACTER, 0, lParam);
  239.  
  240.       if (hFile != INVALID_HANDLE_VALUE)
  241.         WriteFile (hFile, &tChar, sizeof(WCHAR), &nBytes, NULL);
  242.  
  243.     } break;
  244.  
  245.  
  246.  
  247.     /**********************************************************************\
  248.     *  WM_COMMAND
  249.     *
  250.     \**********************************************************************/
  251.     case WM_COMMAND: {
  252.  
  253.       switch (LOWORD(wParam)) {
  254.  
  255.         /******************************************************************\
  256.         *  WM_COMMAND, IDM_NEWWINDOW
  257.         *
  258.         * global - hwndClient, hInst
  259.         *
  260.         * Simply create a new MDI child window.
  261.         \******************************************************************/
  262.         case IDM_NEWWINDOW: {
  263.           HWND hwndDisplay;
  264.  
  265.           hwndDisplay = CreateMDIWindow(
  266.               TEXT("display"),
  267.               TEXT("Display"),
  268.               WS_CHILD | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE |
  269.                          WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_HSCROLL,
  270.               CW_USEDEFAULT,
  271.               CW_USEDEFAULT,
  272.               CW_USEDEFAULT,
  273.               CW_USEDEFAULT,
  274.               hwndClient, hInst, 0);
  275.         } break;
  276.  
  277.  
  278.  
  279.         /******************************************************************\
  280.         *  WM_COMMAND, IDM_NEWFILE
  281.         *
  282.         * global - hFile.
  283.         \******************************************************************/
  284.         case IDM_NEWFILE: {
  285.           DWORD nBytes;
  286.  
  287.           hFile = OpenNewFile (hwnd);
  288.           /* Write the unicode byte order mark */
  289.           WriteFile (hFile, "\xFE\xFF", 2, &nBytes, NULL);
  290.         } break;
  291.  
  292.  
  293.         /******************************************************************\
  294.         *  WM_COMMAND, IDM_CLOSEFILE
  295.         *
  296.         * global - hFile.
  297.         \******************************************************************/
  298.         case IDM_CLOSEFILE:
  299.           CloseHandle (hFile);
  300.           hFile = INVALID_HANDLE_VALUE;
  301.           SendMessage (hwndStatus, WMU_SETFILENAME, 0, (LPARAM)NULL);
  302.         break;
  303.  
  304.  
  305.         case IDM_HELP:
  306.           WinHelp( hwnd, szHelpPathName, HELP_INDEX, (DWORD) NULL );
  307.         break;
  308.  
  309.  
  310.         case IDM_ABOUT:
  311.           DialogBox (hInst, TEXT("aboutBox"), hwnd, (DLGPROC) About);
  312.         break;
  313.  
  314.  
  315.  
  316.         /******************************************************************\
  317.         *  WM_COMMAND, IDM_SHOWHEX
  318.         *
  319.         * Check menu on and off.  Set global value: gShowHex
  320.         \******************************************************************/
  321.         case IDM_SHOWHEX:
  322.           if (GetMenuState (GetMenu (hwnd),IDM_SHOWHEX, MF_BYCOMMAND)
  323.                 == MF_CHECKED) {
  324.             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
  325.             gShowhex = FALSE;
  326.             RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN);
  327.           } else {
  328.             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
  329.             gShowhex = TRUE;
  330.             RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN);
  331.           }
  332.         break;
  333.  
  334.  
  335.         /******************************************************************\
  336.         *  WM_COMMAND, IDM_SHOWNAMES
  337.         *
  338.         * Check menu on and off.  Set global value: gShowNames
  339.         \******************************************************************/
  340.         case IDM_SHOWNAMES:
  341.           if (GetMenuState (GetMenu (hwnd),IDM_SHOWNAMES, MF_BYCOMMAND)
  342.                 == MF_CHECKED) {
  343.             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
  344.             gShowNames = FALSE;
  345.           } else {
  346.             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
  347.             gShowNames = TRUE;
  348.           }
  349.           // PROBLEM:  Need to send message to all child windows.
  350.  
  351.           hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
  352.           SendMessage (hwndActive, WMU_NEWRANGE, 0,0);
  353.           InvalidateRect (hwndActive, NULL, TRUE);
  354.  
  355.         break;
  356.  
  357.  
  358.         /******************************************************************\
  359.         *  WM_COMMAND, IDM_CHAR*
  360.         *
  361.         * manage mutually exclusive menu indicating number of chars per line
  362.         \******************************************************************/
  363.         case IDM_CHAR10:
  364.         case IDM_CHAR16:
  365.         case IDM_CHAR20:
  366.         case IDM_CHAR32:
  367.         case IDM_CHAR40:
  368.         case IDM_CHAR64:
  369.  
  370.         { HMENU hMenu;
  371.           int nCharPerLine;
  372.  
  373.           hMenu = GetMenu (hwnd);
  374.  
  375.           CheckMenuItem(hMenu, IDM_CHAR10, MF_UNCHECKED);
  376.           CheckMenuItem(hMenu, IDM_CHAR16, MF_UNCHECKED);
  377.           CheckMenuItem(hMenu, IDM_CHAR20, MF_UNCHECKED);
  378.           CheckMenuItem(hMenu, IDM_CHAR32, MF_UNCHECKED);
  379.           CheckMenuItem(hMenu, IDM_CHAR40, MF_UNCHECKED);
  380.           CheckMenuItem(hMenu, IDM_CHAR64, MF_UNCHECKED);
  381.  
  382.           CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED);
  383.  
  384.           /* notice the value is coded into the menu i.d. */
  385.           nCharPerLine = LOWORD(wParam)-IDM_CHARBASE;
  386.           hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
  387.           SendMessage (hwndActive, WMU_SETNCHAR, nCharPerLine ,0);
  388.           InvalidateRect (hwndActive, NULL, TRUE);
  389.  
  390.         } break;
  391.  
  392.  
  393.  
  394.         /******************************************************************\
  395.         *  WM_COMMAND, IDM_FONT*
  396.         *
  397.         * manage mutually exclusive menu indicating font height
  398.         \******************************************************************/
  399.         case IDM_FONT18:
  400.         case IDM_FONT36:
  401.         case IDM_FONT72:
  402.  
  403.         { HMENU hMenu;
  404.           int Width, Height;
  405.           hMenu = GetMenu (hwnd);
  406.  
  407.           CheckMenuItem(hMenu, IDM_FONT18, MF_UNCHECKED);
  408.           CheckMenuItem(hMenu, IDM_FONT36, MF_UNCHECKED);
  409.           CheckMenuItem(hMenu, IDM_FONT72, MF_UNCHECKED);
  410.  
  411.           CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED);
  412.  
  413.           /* notice the value is coded into the menu i.d. */
  414.           Height = LOWORD(wParam)-IDM_FONTBASE;
  415.           /* scale the width proportionately */
  416.           Width = Height * UCFONTWIDTH/UCFONTHEIGHT;
  417.  
  418.           hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
  419.           SendMessage (hwndActive, WMU_NEWFONT, (WPARAM)Width,(LPARAM)Height);
  420.           InvalidateRect (hwndActive, NULL, TRUE);
  421.  
  422.         } break;
  423.  
  424.  
  425.  
  426.         /******************************************************************\
  427.         *  WM_COMMAND, IDM_MDI*
  428.         *
  429.         * misc. MDI responsibilities.  hwndClient does real work.
  430.         \******************************************************************/
  431.         case IDM_MDICASCADE: SendMessage (hwndClient, WM_MDICASCADE, 0,0); break;
  432.         case IDM_MDITILE:    SendMessage (hwndClient, WM_MDITILE, MDITILE_HORIZONTAL,0); break;
  433.         break;
  434.  
  435.  
  436.  
  437.  
  438.       } /* end switch */
  439.     } break;  /* end WM_COMMAND */
  440.  
  441.  
  442.  
  443.  
  444.  
  445.     /**********************************************************************\
  446.     *  WM_DESTROY
  447.     \**********************************************************************/
  448.     case WM_DESTROY:
  449.       WinHelp( hwnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL );
  450.       PostQuitMessage(0);
  451.     break;
  452.  
  453.  
  454.  
  455.  
  456.  
  457.     default: break;
  458.     } /* end switch */
  459.  
  460.   return (DefFrameProc(hwnd, hwndClient, message, wParam, lParam));
  461. }
  462.  
  463.  
  464.  
  465. /***************************************************************************\
  466. *    FUNCTION: About
  467. \***************************************************************************/
  468. LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  469. {
  470.   if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) {
  471.     EndDialog (hwnd, TRUE);
  472.     return TRUE;
  473.   }
  474.   if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) {
  475.     EndDialog (hwnd, TRUE);
  476.     return TRUE;
  477.   }
  478.   return FALSE;
  479. }
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487. /***************************************************************************\
  488. *
  489. *    FUNCTION: OpenNewFile(HWND)
  490. *
  491. *    PURPOSE:  Invokes common dialog function to open a file and opens it.
  492. *
  493. \***************************************************************************/
  494. HANDLE OpenNewFile( HWND hwnd )
  495. {
  496.    TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH];
  497.    OPENFILENAME OpenFileName;
  498.  
  499.  
  500.    wsprintf (szFile, TEXT(""));
  501.    wsprintf (szFileTitle, TEXT(""));
  502.  
  503.    OpenFileName.lStructSize       = sizeof(OPENFILENAME);
  504.    OpenFileName.hwndOwner         = hwnd;
  505.    OpenFileName.hInstance         = (HANDLE) hInst;
  506.    OpenFileName.lpstrFilter       = NULL;
  507.    OpenFileName.lpstrCustomFilter = NULL;
  508.    OpenFileName.nMaxCustFilter    = 0L;
  509.    OpenFileName.nFilterIndex      = 1L;
  510.    OpenFileName.lpstrFile         = szFile;
  511.    OpenFileName.nMaxFile          = sizeof(szFile);
  512.    OpenFileName.lpstrFileTitle    = szFileTitle;
  513.    OpenFileName.nMaxFileTitle     = sizeof(szFileTitle);
  514.    OpenFileName.lpstrInitialDir   = NULL;
  515.    OpenFileName.lpstrTitle        = TEXT("Open a File");
  516.  
  517.    OpenFileName.nFileOffset       = 0;
  518.    OpenFileName.nFileExtension    = 0;
  519.    OpenFileName.lpstrDefExt       = NULL;
  520.  
  521.    OpenFileName.lCustData         = 0;
  522.  
  523.    OpenFileName.Flags = OFN_HIDEREADONLY;
  524.  
  525.    if (!GetOpenFileName(&OpenFileName)) return INVALID_HANDLE_VALUE;
  526.  
  527.    /* update status bar with the file title. */
  528.    SendMessage (hwndStatus, WMU_SETFILENAME, 0, (LPARAM)OpenFileName.lpstrFileTitle);
  529.  
  530.    return (CreateFile(OpenFileName.lpstrFile,
  531.                       GENERIC_WRITE,
  532.                       0,
  533.                       NULL,
  534.                       CREATE_ALWAYS,
  535.                       FILE_ATTRIBUTE_NORMAL,
  536.                       NULL));
  537. }
  538.